package pe.com.bbva.ge.negocio;

import java.io.Serializable;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

/**
 * Capa de negocio que permite invocar a las operaciones de persistencia CRUD (Create Read Update Delete).
 * La transacción esta configurado para solo lectura por defecto. Solo las operaciones crear, modificar, eliminar, grabarTodos y eliminarTodos tienen permisos de escritura. 
 * 
 * @author mmelgar
 */
@Transactional(readOnly = true)
public interface CrudNegocio extends BaseNegocio {
	
	/**
	 * Invoca a la operación crear entidad.
	 * 
	 * @param entidad a registrar
	 */
	@Transactional
	<Entidad> void crear(Entidad entidad);
	
	/**
	 * Invoca a la operación modificar entidad.
	 * 	
	 * @param entidad a modificar
	 */
	@Transactional
	<Entidad> void modificar(Entidad entidad);

	/**
	 * Invoca a la operación elimiar entidad.
	 * 
	 * @param entidad a eliminar
	 */
	@Transactional
	<Entidad> void eliminar(Entidad entidad);
	
	/**
	 * Permite eliminar según el id enviado.
	 * @param id del registro a eliminar.
	 * @param clase que pertenece la entidad
	 */
	@Transactional
	<Entidad> void eliminar(Serializable id, Class<Entidad> clase);

	/**
	 * Invoca a la operación obtener entidad.
	 * 
	 * @param id llave primaria de la entidad
	 * @param clase que pertenece la entidad
	 * @return Entidad obtenida. De no encontrar será <code>null</code>
	 */
	<Entidad> Entidad obtener(Serializable id, Class<Entidad> clase);

	/**
	 * Permite grabar las entidades enviadas en la <code>lista</code>. Para las entidades nuevas las registras y para las entidades existientes las modifica.
	 * 
	 * @param lista de entidades a grabar
	 */
	@Transactional
	<Entidad> void grabarTodos(List<Entidad> lista);

	/**
	 * Permite eliminar las entidades de la <code>lista</code>
	 * 
	 * @param lista de entidades a eliminar
	 */
	@Transactional
	<Entidad> void eliminarTodos(List<Entidad> lista);

	/**
	 * <p>Obtiene <b>todas</b> las entidades de la BBDD</p>
	 * 
	 * @param clase a la que pertenece la lista a obtener
	 * @return Lista de Entidades
	 */
	<Entidad> List<Entidad> obtenerTodos(Class<Entidad> clase);
	
	/**
	 * <p>Obtiene <b>todas</b> las entidades activas de la BBDD</p>
	 * 
	 * @param clase
	 * @return Lista de Entidades
	 */
	<Entidad> List<Entidad> obtenerActivos(Class<Entidad> clase);

	/**
	 * Obtiene la cantidad de registros de la entidades.
	 * 
	 * @param clase a contar sus registros
	 * @return Total de Entidades
	 */
	<Entidad> long contar(Class<Entidad> clase);

}
